#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,k,d,h[500010],t[500010],cnt,x,y;
vector<int> dl[500010];
struct node{
	int ls,rs,num,pos,mx,tag,siz,rnd;
}tr[500010];
#define ls(u) tr[u].ls
#define rs(u) tr[u].rs
#define num(u) tr[u].num
#define pos(u) tr[u].pos
#define mx(u) tr[u].mx
#define tag(u) tr[u].tag
#define siz(u) tr[u].siz
#define rnd(u) tr[u].rnd
struct Treap{
	int rt=0;
	void newnode(int x,int y){
		tr[++cnt]={0,0,y,x,y,0,1,rand()};
	}
	void maketag(int u,int tag){
		mx(u)+=tag,tag(u)+=tag,num(u)+=tag;
	}
	void pushdown(int u){
		maketag(ls(u),tag(u)),maketag(rs(u),tag(u));
		tag(u)=0;
	}
	void pushup(int u){
		mx(u)=max({mx(ls(u)),mx(rs(u)),num(u)});
		siz(u)=siz(ls(u))+siz(rs(u))+1;
	}
	int merge(int x,int y){
		if(!x||!y) return x+y;
		if(rnd(x)<rnd(y)){
			pushdown(x);
			rs(x)=merge(rs(x),y);
			pushup(x);
			return x;
		}else{
			pushdown(y);
			ls(y)=merge(x,ls(y));
			pushup(y);
			return y;
		}
	}
	void split(int u,int &x,int &y,int p){
		if(!u){
			x=y=0;
			return;
		}
		pushdown(u);
		if(pos(u)<=p){
			x=u;
			split(rs(u),rs(x),y,p);
		}else{
			y=u;
			split(ls(u),x,ls(y),p);
		}
		pushup(u);
	}
	void ins(int p,int m){
		x=y=0;
		newnode(p,m);
		split(rt,x,y,p-1);
		rt=merge(x,merge(cnt,y));
	}
	void del(int p){
		x=y=0;
		split(rt,x,rt,p);
	}
	void upd(int x){
		maketag(rt,x);
	}
}T[500010];
map<int,int> m;
int f[500010];
void clr(int x){
	m[x]--;
	if(m[x]<=0) m.erase(x);
}
signed main(){
	freopen("holiday.in","r",stdin);
	freopen("holiday.out","w",stdout);
	srand(time(0));
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	mx(0)=-1e18;
	cin>>n>>k>>d;
	for(int i=1;i<=n;i++)
		cin>>h[i];
	for(int i=1;i<n;i++){
		cin>>t[i];
		dl[i+t[i]+1].push_back(i);
	}
	for(int i=1;i<=n;i++){
		for(auto &j:dl[i])
			if(siz(T[j%k].rt)){
				clr(mx(T[j%k].rt));
				T[j%k].del(i);
				m[mx(T[j%k].rt)]++;
			}
		if(siz(T[i%k].rt)){
			clr(mx(T[i%k].rt));
			T[i%k].upd(-d);
			m[mx(T[i%k].rt)]++;
		}
		if(!m.empty()) f[i]=m.rbegin()->first+h[i];
		else f[i]=h[i];
		clr(mx(T[i%k].rt));
		T[i%k].ins(i+t[i]+1,f[i]);
		m[mx(T[i%k].rt)]++;
	}
	cout<<f[n];
	return 0;
}
